Skip to content

test(core): add comprehensive RetryManager test suite#1159

Merged
abueide merged 12 commits intomasterfrom
tapi/retry-manager-tests
Mar 24, 2026
Merged

test(core): add comprehensive RetryManager test suite#1159
abueide merged 12 commits intomasterfrom
tapi/retry-manager-tests

Conversation

@abueide
Copy link
Contributor

@abueide abueide commented Mar 10, 2026

Summary

  • Add comprehensive RetryManager test suite covering all states and transitions
  • 38 tests total, all passing:
    • canRetry: READY/RATE_LIMITED/BACKING_OFF states, wait expiry transitions, disabled configs
    • handle429: retry count, lazy consolidation, clamping, negative/zero retry-after, max count/duration limits with limit_exceeded return verification, 429-overrides-BACKING_OFF, Retry-After authority
    • handleTransientError: retry count, exponential backoff, max backoff clamping, max count/duration limits with limit_exceeded return verification
    • reset: count and state reset
    • retryStrategy: lazy (default), eager, applies to transient errors
    • autoFlush: timer fires, no-callback safety, clear on reset/destroy, timer replacement
    • return values: undefined when configs disabled
    • jitter: additive jitter formula with non-zero jitterPercent, zero jitter adds no randomness
    • isPersistedStateValid: clock skew detection (firstFailureTime in future)
    • mixed errors: 429 wait time takes precedence over shorter transient backoff

PR 4 of 5 in the TAPI backoff/retry stack. Depends on #1158.

Test plan

  • All 38 RetryManager tests pass
  • All 454 total tests pass

🤖 Generated with Claude Code

@abueide abueide force-pushed the tapi/retry-manager branch 2 times, most recently from 3371651 to 0c85b0f Compare March 12, 2026 14:57
@abueide abueide force-pushed the tapi/retry-manager-tests branch 2 times, most recently from ba89956 to aac6169 Compare March 12, 2026 14:57
@abueide abueide force-pushed the tapi/retry-manager branch from 0c85b0f to 8f21c88 Compare March 12, 2026 15:30
@abueide abueide force-pushed the tapi/retry-manager-tests branch from aac6169 to cf2abd2 Compare March 12, 2026 15:36
@abueide abueide force-pushed the tapi/retry-manager branch from 8f21c88 to 225e64a Compare March 12, 2026 16:11
@abueide abueide force-pushed the tapi/retry-manager-tests branch from cf2abd2 to 23ae940 Compare March 12, 2026 16:11
@abueide abueide force-pushed the tapi/retry-manager branch from 225e64a to f51911b Compare March 12, 2026 16:40
@abueide abueide force-pushed the tapi/retry-manager-tests branch from 23ae940 to 9f2575b Compare March 12, 2026 16:40
@abueide abueide force-pushed the tapi/retry-manager branch from f51911b to fcdc491 Compare March 12, 2026 16:48
@abueide abueide force-pushed the tapi/retry-manager-tests branch from 9f2575b to 6981059 Compare March 12, 2026 16:48
@abueide abueide force-pushed the tapi/retry-manager branch from fcdc491 to a8c9435 Compare March 12, 2026 17:38
@abueide abueide force-pushed the tapi/retry-manager-tests branch from 6981059 to c49e640 Compare March 12, 2026 17:38
@abueide abueide force-pushed the tapi/retry-manager branch from a8c9435 to ad417e4 Compare March 18, 2026 21:14
@abueide abueide force-pushed the tapi/retry-manager-tests branch from c49e640 to 02cca5f Compare March 18, 2026 21:14
@abueide abueide force-pushed the tapi/retry-manager branch from ad417e4 to 06a5962 Compare March 18, 2026 22:12
@abueide abueide force-pushed the tapi/retry-manager-tests branch 2 times, most recently from 42d7cd1 to 6bf54b1 Compare March 18, 2026 22:32
@abueide abueide force-pushed the tapi/retry-manager branch 2 times, most recently from 2539c34 to fa31a9c Compare March 19, 2026 16:02
@abueide abueide force-pushed the tapi/retry-manager-tests branch 2 times, most recently from f52a425 to e83d5ab Compare March 19, 2026 16:15
@abueide abueide force-pushed the tapi/retry-manager branch from 2d313d8 to 89ce849 Compare March 19, 2026 17:03
@abueide abueide force-pushed the tapi/retry-manager-tests branch from e83d5ab to 91c9ce3 Compare March 19, 2026 17:03
@abueide abueide force-pushed the tapi/retry-manager branch from 89ce849 to 548872e Compare March 19, 2026 17:56
@abueide abueide force-pushed the tapi/retry-manager-tests branch from 91c9ce3 to 7242cbf Compare March 19, 2026 17:56
@abueide abueide force-pushed the tapi/retry-manager branch from 548872e to 4f8ea2f Compare March 19, 2026 18:22
@abueide abueide force-pushed the tapi/retry-manager branch from dbe8e59 to fd41e95 Compare March 23, 2026 15:59
@abueide abueide force-pushed the tapi/retry-manager-tests branch from e00cdf7 to b0855f7 Compare March 23, 2026 15:59
@abueide abueide force-pushed the tapi/retry-manager branch from fd41e95 to 4a96660 Compare March 23, 2026 18:08
@abueide abueide force-pushed the tapi/retry-manager-tests branch from b0855f7 to 3ab9660 Compare March 23, 2026 18:08
@abueide abueide force-pushed the tapi/retry-manager branch from 4a96660 to 31f8677 Compare March 23, 2026 18:24
@abueide abueide force-pushed the tapi/retry-manager-tests branch from 3ab9660 to 3bb783a Compare March 23, 2026 18:24
@abueide abueide force-pushed the tapi/retry-manager branch from 31f8677 to 72f014c Compare March 23, 2026 19:02
@abueide abueide force-pushed the tapi/retry-manager-tests branch 6 times, most recently from 7b9920f to b4fe8b9 Compare March 23, 2026 20:32
Base automatically changed from tapi/retry-manager to master March 24, 2026 00:45
abueide and others added 11 commits March 23, 2026 19:47
- Validate persisted state in canRetry() to handle clock changes/corruption
  per SDD §Metadata Lifecycle
- Move backoff calculation inside dispatch to avoid stale retryCount from
  concurrent batch failures (handleErrorWithBackoff)
- Ensure RATE_LIMITED state is never downgraded to BACKING_OFF
- Update reset() docstring to clarify when it should be called

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplify class docstring to describe current architecture without
referencing SDD deviations. Remove redundant inline comments, compact
JSDoc to single-line where appropriate, and ensure all comments use
present tense.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gnaling

- Use getState(true) for queue-safe reads to prevent race conditions
  between concurrent canRetry/handle429/handleTransientError calls
- Consolidate handleError and handleErrorWithBackoff into a single
  method that accepts a computeWaitUntilTime function
- Extract side effects (logging, Math.random) from dispatch reducers
- Return RetryResult ('rate_limited'|'backed_off'|'limit_exceeded')
  from handle429/handleTransientError so callers can drop events on
  limit exceeded
- Clear auto-flush timer in transitionToReady
- Validate state string in isPersistedStateValid

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace string literals with TypeScript enums:
- RetryState enum (READY, RATE_LIMITED, BACKING_OFF)
- RetryResult enum (RATE_LIMITED, BACKED_OFF, LIMIT_EXCEEDED)

Extract helper methods for clarity:
- resolveStatePrecedence(): handles 429 taking priority over backoff
- consolidateWaitTime(): uses switch statement for clear wait time logic
- getStateDisplayName(): maps state to display names

Benefits:
- Type-safe state handling (no magic strings)
- Switch statements make control flow explicit
- Each helper method has a single, named responsibility
- Easier to test and maintain

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Use Object.values(RetryState).includes() instead of maintaining a
duplicate Set of valid states. More idiomatic TypeScript and eliminates
maintenance burden of keeping Set in sync with enum.
Add 29 tests covering all RetryManager states and transitions:
canRetry, handle429 rate limiting, handleTransientError backoff,
reset, retry strategies (eager/lazy), autoFlush callbacks, and
mixed error scenarios.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Updated test to verify that 429 now correctly overrides BACKING_OFF state
rather than being silently ignored. The 429's retry-after takes precedence.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add test verifying 429 Retry-After overrides long transient backoff
- Track RetryManager instances in autoFlush tests and destroy in
  afterEach to prevent timer leaks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update log assertions for consolidated limit-exceeded message. Add tests
for: RetryResult return values, jitter calculation, isPersistedStateValid
clock skew detection, handle429(0) edge case, and strengthened assertions
that verify behavioral state after clamping/rejection (not just log output).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@abueide abueide force-pushed the tapi/retry-manager-tests branch from b4fe8b9 to f274d86 Compare March 24, 2026 15:25
@abueide abueide merged commit aaf6348 into master Mar 24, 2026
7 checks passed
@abueide abueide deleted the tapi/retry-manager-tests branch March 24, 2026 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants